/**
 * 2017年8月22日
 */
package exp.config;

import java.io.IOException;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import exp.core.ThreadSafe;
import freemarker.template.TemplateExceptionHandler;
import weka.core.converters.CSVSaver;
/**
 * @author Alex
 *
 */
@Configuration
public class BasicConfiguration {
	
	@Bean 
	@Scope("singleton")
	//默认也是单例的,这里只是为了强调 fm的官网上明确的写明这个类要是单例
	public freemarker.template.Configuration freemarkerConfiguratin() throws IOException{
		freemarker.template.Configuration cfg = new freemarker.template.Configuration(freemarker.template.Configuration.VERSION_2_3_23);
		Resource r  = new ClassPathResource("templates");
		cfg.setDirectoryForTemplateLoading(r.getFile());
		cfg.setDefaultEncoding("utf-8");
		cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
		cfg.setLogTemplateExceptions(false);
		return cfg;
	}

	@Bean
	@Scope("singleton")
	public ThreadSafe<CSVSaver> csvSaver() throws IOException{
		return new ThreadSafe<CSVSaver>(_csvSaver());
	}
	
	private ThreadLocal<CSVSaver> _csvSaver() throws IOException{
		return new ThreadLocal<CSVSaver>(){
			@Override
			protected CSVSaver initialValue() {
				CSVSaver af = new CSVSaver();
				//默认不保存arff的文件头 (元信息,因为用来可视化的基本都不需要)
				af.setNoHeaderRow(true);
				af.resetWriter();
				af.resetOptions();
				af.resetStructure();
				return af;
			}
		};
	}
}
